import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
// 获取所有页面组件
const pageModules: any = import.meta.glob('@/pages/**/*.vue');

const routes: RouteRecordRaw[] = Object.keys(pageModules).map((filePath) => {
    // 动态路由数组
    const activeParams: string[] = ['vueUse'];
    const fileItem = filePath.split('/')[3];
    const fileName = activeParams.includes(fileItem)
        ? fileItem + '/:id'
        : fileItem;

    const route: RouteRecordRaw = {
        path: `/${fileName}`,
        name: fileItem, // 处理子目录情况
        component: pageModules[filePath], // 异步路由+直接使用模块引用
    };

    // 拦截路由守卫数组和配置路由独享守卫
    /*
        缺点：路由独享守卫拦不住浏览器导航跳转
    */
    const beforeEachArrays: string[] = ['vueRouter'];
    if (beforeEachArrays.includes(fileItem)) {
        route.beforeEnter = (to, from, next) => {
            console.log('路由11守卫', to, from);
            if (from.path === '/index') {
                alert('测试路由独享守卫');
            } else {
                next();
            }
        };
    }
    return route;
});

routes.unshift({
    path: '/',
    redirect: { name: 'index' }, // 使用命名路由更安全
});

const router = createRouter({
    history: createWebHistory(),
    routes, // 简化写法
    scrollBehavior(to, from, savedPosition) {
        // savedPosition:浏览器记录的滚动位置（仅通过前进/后退按钮导航时存在）
        return savedPosition || { top: 0 };
    }, // 滚动行为: 路由跳转时，savedPosition存在就页面滚动到指定位置，不存在就滚动到顶部
});

// -----------------路由守卫-----------------

/*
    执行顺序：1
    全局路由守卫：进入路由之前执行
*/
router.beforeEach((to, from, next) => {
    console.log('路由守卫-进入之前', to.fullPath, from.path);
    // if (to.fullPath === '/keepAlive') {
    //     alert('keepAlive')
    // } else {
    //     next();
    // }
    next();
});

/*
    执行顺序：2
    全局路由守卫：所有组件解析完成后调用
*/
router.beforeResolve((to, from, next) => {
    console.log('[导航] 从', from.path, '到', to.path);
    console.log('[参数变化]', from.params, '→', to.params);
    next();
});

/*
    执行顺序：3
    全局路由守卫：进入路由之后执行
*/
router.afterEach((to, from) => {
    console.log('路由守卫-进入之后', to.fullPath, from.path);
});

/*
  导航发生错误时
*/
router.onError((error) => {
    console.log('路由守卫-导航错误', error);
});

export default router;
